; 用户程序
;-----------------
; 程序头部
;-----------------
SECTION header vstart=0
    program_length dd program_end

    head_length dd header_end   ; 头部长度
    
    stack_seg dd 0   ; 用于接收堆栈段选择子
    stack_len dd 1   ; 程序建议的堆栈大小，以 4KB 为单位

    program_entry dd start ; 程序入口
    code_seg dd section.code.start
    code_len dd code_end

    data_seg dd section.data.start
    data_len dd data_end
;-------------------------
; 符号地址索引
;-------------------------
salt_items dd (header_end-salt)/256
salt:
    PrintString dd '@PrintString'
        times 256-($-PrintString) db 0
    TerminateProgram db '@TerminateProgram'
        times 256-($-TerminateProgram) db 0
header_end:
;--------------------------
; 数据段
;--------------------------
SECTION data vstart=0
         message_1        db  0x0d,0x0a
                          db  '[USER TASK]: Hi! nice to meet you,'
                          db  'I am run at CPL=',0
                          
         message_2        db  0
                          db  '.Now,I must exit...',0x0d,0x0a,0
data_end:
;============================
[bits 32]
;============================
SECTION code vstart=0
start:
         ;任务启动时，DS指向头部段，也不需要设置堆栈 
         mov eax,ds
         mov fs,eax
     
         mov eax,[data_seg]
         mov ds,eax
     
         mov ebx,message_1
         call far [fs:PrintString]
         
         mov ax,cs
         and al,0000_0011B
         or al,0x0030
         mov [message_2],al
         
         mov ebx,message_2
         call far [fs:PrintString]
     
         call far [fs:TerminateProgram]      ;退出，并将控制权返回到核心 
code_end:
SECTION trailer
program_end: